# Python 数据库编程
'''
pymysql模块
基本使用
增删改查
'''

# pymysql模块
'''
pymysql是Python中操作MySQL的模块，其使用方法和MySQLdb几乎相同。但目前pymysql支持python3.x而后者不支持3.x版本。
pymysql是第三方模块，需要单独安装，首先通过pip安装PyMySQL:
# pip install pymysql
如果安装报错 加上-i 参数指定国内源进行安装
# pip3.8 install pymysql -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
'''

# 登录MySQL数据库，创建一个fdd库，再创建一张users表:
'''
create database django;
use django;
create table users(
id int primary key not null auto_increment,
username varchar(50) not null,
password varchar(50) not null
);
'''


# 导入引用pymysql模块
#import pymysql
#conn = pymysql.connect(host='192.168.1.122',
#                       port=3306,
#                       user='root',
#                       password='123456',
#                       db='fdd',
#                       charset='utf8',
#                       cursorclass=pymysql.cursors.DictCursor
#                       )
#cursor = conn.cursor()
## 创建一条记录
#sql = "insert into users(username, password) values('python','3620192')"
#cursor.execute(sql)    # 执行sql语句
## 写入到数据库
#conn.commit()
## 查询(读取记录)
#sql1 = "select username,password from users"
#cursor.execute(sql1)
#result = cursor.fetchall()   # 从运行结果中取所有记录，返回列表
#print(result)
## 关闭游标(链接)
#conn.close()



# 基本使用
#connect()函数常用参数:
'''
方法                      描述
host                     数据库主机地址
user                     数据库账户
passwd                   账户密码
db                       使用的数据库
port                     数据库主机端口，默认3306
connect_timeout          连接超时时间，默认10，单位秒
charset                  使用的字符集
cursorclass              自定义游标使用的类。
'''
#连接对象常用方法:
'''
方法                      描述
commit()                 提交事务。对支持事务的数据库和表，如果提交修改操作，不适用这个方法，则不会写到数据库中。
rollback()               事务回滚。对支持事务的数据库和表，如果执行此方法，则回滚当前事务。在没有commit()前提下。
cursor([cursorclass])    创建一个游标对象。所有的sql语句执行都要在游标下进行。MySQL本身不支持游标，MySQLdb模块对其游标进行了仿真。
'''
#游标对象常用方法:
'''
方法                      描述
close()                  关闭游标
execute(sql)             执行sql语句
executemany(sql)         执行多条sql语句
fetchone()               从运行结果中取第一条记录，返回字典
fetchmany(n)             从运行结果中取n条记录，返回列表
fetchall()               从运行结果中取所有记录，返回列表
'''


# 增加查询
import pymysql
conn = pymysql.connect(host='192.168.1.123',
                       port=3307,
                       user='root',
                       password='123456',
                       db='django',
                       charset='utf8',
                       cursorclass=pymysql.cursors.DictCursor
                       )
cursor = conn.cursor()

# 批量创建多条记录并写入到数据库
sql = "insert into users(username,password) values(%s, %s)"
args = [('pytho','12345'),('java','21648'),('shell','835932')]
args = [('张三','124687'),('李四','12417864'),('王五','12412668')]
cursor.executemany(sql, args)
# 写入到数据库
conn.commit()
# 查询记录
sql1 = "select username,password from users"
cursor.execute(sql1)
result = cursor.fetchall()    #获取所有记录
#result = cursor.fetchmany(3)   #获取3条记录
print(result)
conn.close()



# 修改删除
'''
import pymysql
conn = pymysql.connect(host='192.168.1.122',
                       port=3306,
                       user='root',
                       password='123456',
                       db='fdd',
                       charset='utf8',
                       cursorclass=pymysql.cursors.DictCursor
                       )
cursor = conn.cursor()

# 修改用户pytho密码为126874655
sql = "update users set password='126874655' where username='pytho'"
# 删除用户 李四
#sql = "delete from users where username='李四'"
cursor.execute(sql)
conn.commit()
'''


# 遍历查询结果
'''
import pymysql
conn = pymysql.connect(host='192.168.1.123',
                       port=3307,
                       user='root',
                       password='123456',
                       db='django',
                       charset='utf8',
                       cursorclass=pymysql.cursors.DictCursor
                       )
cursor = conn.cursor()

# 使用异常处理
try:
    with conn.cursor() as cursor:    #等同于 cursor = conn.cursor()
        sql = "select * from users"
        cursor.execute(sql)
        result = cursor.fetchall()
    for d in result:
        #print(d)
        print(f"ID: {d['id']}  用户名: {d['username']}   密码: {d['password']}")
finally:
    conn.close()
'''